home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 11 / FM Towns Free Software Collection 11.iso / t_os / tool / dolmorph / src / movfile.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-01-19  |  12.3 KB  |  459 lines

  1. #if 0
  2.         ●スクロールバー付属の数値表示の更新
  3.     static    void    setParaSoftMsg(int bRedraw)
  4.     static    void    setParaRoughMsg(int bRedraw)
  5.     static    void    setParaWaitMsg(int bRedraw)
  6.  
  7.         ●モジュールの初期化・終了
  8.             int        init_movfile(void)
  9.             void    end_movfile(void)
  10.  
  11.         ●MOVファイル作成中に呼ばれる通信関数
  12.     static    int        movfile_loadframe(char *buf, int nFrame,
  13.                                       int *nWidth, int *nHeight)
  14.     static    int        movfile_recsucceed(int nFrame)
  15.  
  16.         ●MOVファイル作成(デスクトップメニューから呼び出される)
  17.             int movfile_checkRec(void)
  18.             void    movfile_rec(void)
  19.  
  20.         ●MOVファイル再生(デスクトップメニューから呼び出される)
  21.             void    movfile_play(void)
  22.  
  23.  
  24. #endif
  25.  
  26. #include <stdio.h>
  27. #include <stdlib.h>
  28. #include <string.h>
  29. #include <winb.h>
  30. #include <te.h>
  31. #include <fntb.h>
  32. #include <gui.h>
  33. #include <wgb.h>
  34. #include <msdos.cf>
  35. #include <file_dlg.h>
  36. #include <snd.h>
  37. #include <egb.h>
  38.  
  39. #include "morph.h"
  40. #include "desktop.h"
  41. #include "points.h"
  42. #include "wgbmac.h"
  43. #include "guisub.h"
  44. #include "image.h"
  45. #include "fifo.h"
  46. #include "domorph.h"
  47. #include "imstore.h"
  48. #include "morphgo.h"
  49. #include "alert.h"
  50. #include "sub.h"
  51. #include "movfile.h"
  52. #include "ugoku.h"
  53.  
  54. #include "makemov.h"
  55.  
  56.     int    idMovRecWin = -1 ;
  57.     int    idMovRecParaSoftSBar = -1 ;
  58.     int    idMovRecParaRoughSBar = -1 ;
  59.     int    idMovRecPremoveTIcon[2] = {-1,-1} ;
  60.     int    idMovRecParaWaitSBar = -1 ;
  61.     int    idMovRecParaSoftMsg = -1 ;
  62.     int    idMovRecParaRoughMsg = -1 ;
  63.     int    idMovRecParaWaitMsg = -1 ;
  64.     int    idMovRecOkDBtn = -1 ;
  65.     int    idMovRecCancelDBtn = -1 ;
  66.     int    idMovRecOkMsg = -1 ;
  67.     int    MovRecCancelMsg = -1 ;
  68.     int    idMovRecInfoMsg = -1 ;
  69.     int    idMovRecSucceedWin = -1 ;
  70.     int    idMovRecSucceedMsg = -1 ;
  71.     int    idMovRecAddWin = -1 ;
  72.     int    idMovRecAddDBtn[3] = -1 ;
  73.  
  74.     static int nParaPremove = 0;    // 0:あり  1:なし
  75.     static int nParaSoft = 0;
  76.     static int nParaRough = 3;
  77.     static int nParaWait = 0;
  78.  
  79. /*--------------------------------------------------------*/
  80. /*           スクロールバー付属の数値表示の更新           */
  81. /*--------------------------------------------------------*/
  82.  
  83.     static void setParaSoftMsg(int bRedraw)
  84.     {
  85.         static char msg[3];
  86.         sprintf(msg,"%2d",nParaSoft);
  87.         MMI_SendMessage(idMovRecParaSoftMsg, MM_SETMSG, 1, msg);
  88.         if (bRedraw)
  89.             MMI_SendMessage(idMovRecParaSoftMsg, MM_SHOW, 0);
  90.     }
  91.  
  92.     static void setParaRoughMsg(int bRedraw)
  93.     {
  94.         static char msg[3];
  95.         sprintf(msg,"%2d",nParaRough);
  96.         MMI_SendMessage(idMovRecParaRoughMsg, MM_SETMSG, 1, msg);
  97.         if (bRedraw)
  98.             MMI_SendMessage(idMovRecParaRoughMsg, MM_SHOW, 0);
  99.     }
  100.  
  101.     static void setParaWaitMsg(int bRedraw)
  102.     {
  103.         static char msg[3];
  104.         sprintf(msg,"%2d",nParaWait);
  105.         MMI_SendMessage(idMovRecParaWaitMsg, MM_SETMSG, 1, msg);
  106.         if (bRedraw)
  107.             MMI_SendMessage(idMovRecParaWaitMsg, MM_SHOW, 0);
  108.     }
  109.  
  110. /*--------------------------------------------------------*/
  111. /*                モジュールの初期化・終了                */
  112. /*--------------------------------------------------------*/
  113.  
  114.     int        init_movfile(void)
  115.     {
  116.         RM_initRadioButton(idMovRecPremoveTIcon,INTNUM(idMovRecPremoveTIcon),
  117.                            &nParaPremove);
  118.         RM_setScrollRange(idMovRecParaSoftSBar, 1, 17, FALSE);
  119.         RM_setScrollPos(idMovRecParaSoftSBar, nParaSoft, FALSE);
  120.         setParaSoftMsg(FALSE);
  121.         RM_setScrollRange(idMovRecParaRoughSBar, 1, 17, FALSE);
  122.         RM_setScrollPos(idMovRecParaRoughSBar, nParaRough, FALSE);
  123.         setParaRoughMsg(FALSE);
  124.         RM_setScrollRange(idMovRecParaWaitSBar, 1, 100, FALSE);
  125.         RM_setScrollPos(idMovRecParaWaitSBar, nParaWait,FALSE);
  126.         setParaWaitMsg(FALSE);
  127.         return 0;
  128.     }
  129.     
  130.     void    end_movfile(void)
  131.     {
  132.     }
  133.  
  134. /*--------------------------------------------------------*/
  135. /*         フレームデータをMOV保存ルーチンに渡す          */
  136. /*--------------------------------------------------------*/
  137.  
  138.     static int movfile_loadframe(char *buf, int nFrame,
  139.                                  int *nWidth, int *nHeight)
  140.         // buf : 320×240×2バイトのバッファ
  141.     {
  142.         IMAGE *pi;
  143.         if (nFrame >= imstore_getFrameNum())
  144.             return -1;
  145.         pi = imstore_getFrame(nFrame);
  146.         int i;
  147.         memset(buf,0,320*240*2);
  148.         for (i=0; i<_min(240,pi->virht); i++)
  149.         {
  150.             memcpy(buf+320*2*i, pi->image+pi->width*2*i,
  151.                    _min(pi->virwid,320)*2);
  152.         }
  153.         if (nWidth != NULL)
  154.             *nWidth = pi->virwid;
  155.         if (nHeight != NULL)
  156.             *nHeight = pi->virht;
  157.         return 0;
  158.     }
  159.  
  160.     static int movfile_recsucceed(int nFrame)
  161.     {
  162.         static char msg[100];
  163.         sprintf(msg,"   フレーム %d / %d   ", nFrame+1, imstore_getFrameNum());
  164.         MMI_SendMessage(idMovRecSucceedMsg, MM_SETMSG, 1, msg);
  165.         MMI_SendMessage(idMovRecSucceedMsg, MM_SHOW, 0);
  166.         return 0;
  167.     }
  168.  
  169. /*--------------------------------------------------------*/
  170. /* MOVファイル作成(デスクトップメニューから呼び出し) */
  171. /*--------------------------------------------------------*/
  172.  
  173.     static int bExec;
  174.     static int nAddSelect;
  175.  
  176.     int movfile_checkRec(void)
  177.     {
  178.         if (imstore_getFrameNum() <= 0)
  179.             return -1;
  180.         else
  181.             return 0;
  182.     }
  183.  
  184.     void movfile_rec(void)
  185.     {
  186.         if (imstore_getFrameNum() <= 0)
  187.         {
  188.             dispAlertMessage("動画ファイル(MOV)作成",
  189.                 "動画倉庫に画像が登録されていないので、動画ファイルを"
  190.                 "作成することができません");
  191.             return;
  192.         }
  193.       // MOVファイルパラメータの設定
  194.         {
  195.           // ドット数、フレーム数の表示
  196.             static char msg[70];
  197.             if (imstore_getFrameNum() > 0)
  198.             {
  199.                 IMAGE *pi = imstore_getFrame(0);
  200.                 sprintf(msg, "   %d×%d pixels, %d frame(s)   ",
  201.                         pi->virwid, pi->virht, imstore_getFrameNum());
  202.             }
  203.             else
  204.                 strcpy(msg, "                                ");
  205.             MMI_SendMessage(idMovRecInfoMsg, MM_SETMSG, 1, msg);
  206.         }
  207.         bExec = 0;
  208.         MORPH_dispWinAlert(idMovRecWin);
  209.         MMI_ExecSystem();
  210.         MORPH_eraseWinAlert(idMovRecWin);
  211.         if (!bExec)
  212.             return;
  213.       // ファイル名の入力
  214.         int ret;
  215.         char pathbuf[100];
  216.         ret = RM_callSimpleFDG(idDesktopAlertHyper, idDesktopSelectiveHyper,
  217.                                "動画(MOV)作成", "作成", "取消",
  218.                                "*.MOV", FDG_FILEONLY|FDG_TEXT, pathbuf);
  219.         if (ret != 0)
  220.             return;    // 「取消」
  221.         char    drive[_MAX_DRIVE+2],dir[_MAX_DIR+2],basename[_MAX_FNAME+2],
  222.                 ext[_MAX_EXT+2];
  223.         _splitpath(pathbuf, drive, dir, basename, ext);
  224.         _makepath(pathbuf, drive, dir, basename, "MOV");
  225.       // 既存ファイル存在のチェック
  226.         nAddSelect = 1;
  227.         if (fexist(pathbuf))
  228.         {
  229.             MORPH_dispWinAlert(idMovRecAddWin);
  230.             MMI_ExecSystem();
  231.             MORPH_eraseWinAlert(idMovRecAddWin);
  232.             if (nAddSelect == 2)
  233.                 return;    // 「取消」ボタン
  234.         }
  235.       // MOVファイルの作成(進行状況も表示)
  236.         int moscsr;
  237.         MG_PushPtr(MOSICON_WAIT, &moscsr);
  238.         MORPH_dispWinAlert(idMovRecSucceedWin);
  239.         MOVPARA para;
  240.         para.soft = nParaSoft;
  241.         para.rough = nParaRough;
  242.         para.premove = (nParaPremove == 0 ? 1 : 0);
  243.         para.wait = nParaWait;
  244.         para.add = (nAddSelect == 0 ? 1 : 0);
  245.         int err;
  246.         err = mov_save(pathbuf, imstore_getFrameNum(),
  247.                        movfile_loadframe, movfile_recsucceed, ¶);
  248.         MORPH_eraseWinAlert(idMovRecSucceedWin);
  249.         MG_PopPtr(moscsr);
  250.         if (err == -2)
  251.             alert_noMemory("動画(MOV)ファイル作成");
  252.     }
  253.  
  254. /*--------------------------------------------------------*/
  255. /*               MOV再生中のチェック関数               */
  256. /*--------------------------------------------------------*/
  257.  
  258.     int movfile_playcheck()
  259.     {
  260.         int sw;
  261.  
  262.     /*    注意:sw 押されているとbit off 押されてないとbit on     */
  263.  
  264.         SND_joy_in_1( 0xff, &sw );        /* end check */
  265.         sw = (sw ^ 0xff) & 0x30;
  266.         if( sw == 0 )return 0;
  267.     c01:    SND_joy_in_1( 0xff, &sw );
  268.         sw = (sw ^ 0xff) & 0x30;
  269.         if( sw & 0x10 ){
  270.             while( sw == 0x30 ){
  271.                 SND_joy_in_1( 0xff, &sw );
  272.                 sw = (sw ^ 0xff) & 0x30;
  273.             }
  274.             if( sw == 0x20 )goto c02;
  275.             while( sw ){
  276.                 SND_joy_in_1( 0xff, &sw );
  277.                 sw = (sw ^ 0xff) & 0x30;
  278.                 if( sw == 0x30 )break;
  279.             }
  280.             return 1;
  281.         }
  282.     c02:    if( sw )goto c01;
  283.         return -1;
  284.     }
  285.  
  286. /*--------------------------------------------------------*/
  287. /*        MOVファイル再生(called from desktop)         */
  288. /*--------------------------------------------------------*/
  289.  
  290.     void movfile_play(void)
  291.     {
  292.         int err;
  293.         err = 0;
  294.       // ファイル名の入力
  295.         int ret;
  296.         char pathbuf[100];
  297.         ret = RM_callSimpleFDG(idDesktopAlertHyper, idDesktopSelectiveHyper,
  298.                                "動画(MOV)再生", "再生", "取消",
  299.                                "*.MOV", FDG_FILEONLY, pathbuf);
  300.         if (ret != 0)
  301.             return;    // 「取消」
  302.         MMI_SendMessage(MMI_GetBaseObj(), MM_ERASE, 0);
  303.         MG_mosDisp(2);
  304.       // 画面の設定
  305.         EGB_writePage(guiEgbPtr, 0);
  306.         EGB_color(guiEgbPtr, 1, 0);    // backcolor
  307.         EGB_clearScreen(guiEgbPtr);
  308.         EGB_writePage(guiEgbPtr, 1);
  309.       // 再生
  310.         int nFrame,x0,y0,x1,y1,wsize;
  311.         if (mov_disk_play_init(pathbuf, movfile_playcheck, &nFrame,
  312.                                &x0,&y0,&x1,&y1,&wsize) != 0)
  313.             goto END;
  314.         char *work;
  315.         if ((work = TL_malloc(wsize+320*240*2)) == NULL)
  316.             {err = -2; goto END;}
  317.         int s ;
  318.         SND_get_elevol_mute( &s ) ;
  319.         SND_elevol_mute( s | 0x03 ) ;
  320.         EGB_displayStart(guiEgbPtr,3,0,0);
  321.         EGB_displayStart(guiEgbPtr,2,2,2);
  322.         int wid,ht;
  323.         wid = _min(320,x1-x0+1);
  324.         ht  = _min(240,y1-y0+1);
  325.         EGB_displayStart(guiEgbPtr,0,(320-wid)/2,(240-ht)/2);
  326.         EGB_displayStart(guiEgbPtr,1,0,0);
  327.         EGB_displayStart(guiEgbPtr,3,320-(320-wid)/2,240-(240-ht)/2);
  328.         mov_disk_play_repeat(work,work+153600,pathbuf,1,0,-1);
  329.         EGB_displayStart(guiEgbPtr,3,0,0);
  330.         EGB_displayStart(guiEgbPtr,2,2,2);
  331.         EGB_displayStart(guiEgbPtr,0,0,0);
  332.         EGB_displayStart(guiEgbPtr,1,0,0);
  333.         EGB_displayStart(guiEgbPtr,3,320,240);
  334.         SND_elevol_mute( s ) ;
  335.         TL_free(work);
  336.        END:
  337.         EGB_writePage(guiEgbPtr, 0);
  338.         MG_mosDisp(3);
  339.         MMI_SendMessage(MMI_GetBaseObj(), MM_SHOW, 0);
  340.         if (err == -2)
  341.             alert_noMemory("動画(MOV)ファイル再生");
  342.     }
  343.  
  344. /*--------------------------------------------------------*/
  345. /*                   部品の呼び出し関数                   */
  346. /*--------------------------------------------------------*/
  347.  
  348.     /*    initDataZMOVFILE:idMovRecWin:MJ_WINDOWL40の呼び出し関数    */
  349.     int    MovRecFunc(kobj, messId, argc, pev, trigger)
  350.     int        kobj ;
  351.     int        messId ;
  352.     int        argc ;
  353.     EVENT    *pev ;
  354.     int        trigger ;
  355.     {
  356.         return NOERR ;
  357.     }
  358.  
  359.     /*    initDataZMOVFILE:idMovRecParaSoftSBar:MJ_SCRLL40の呼び出し関数    */
  360.     int    idMovRecParaSoftSBarFunc(kobj, messId, argc, pev, trigger)
  361.     int        kobj ;
  362.     int        messId ;
  363.     int        argc ;
  364.     EVENT    *pev ;
  365.     int        trigger ;
  366.     {
  367.         nParaSoft = RM_getScrollPos(kobj);
  368.         setParaSoftMsg(TRUE);
  369.         return NOERR ;
  370.     }
  371.  
  372.     /*    initDataZMOVFILE:idMovRecParaRoughSBar:MJ_SCRLL40の呼び出し関数    */
  373.     int    idMovRecParaRoughSBarFunc(kobj, messId, argc, pev, trigger)
  374.     int        kobj ;
  375.     int        messId ;
  376.     int        argc ;
  377.     EVENT    *pev ;
  378.     int        trigger ;
  379.     {
  380.         nParaRough = RM_getScrollPos(kobj);
  381.         setParaRoughMsg(TRUE);
  382.         return NOERR ;
  383.     }
  384.  
  385.     /*    initDataZMOVFILE:idMovRecPremoveTIcon[0]:MJ_TICONL40の呼び出し関数    */
  386.     /*    initDataZMOVFILE:idMovRecPremoveTIcon[1]:MJ_TICONL40の呼び出し関数    */
  387.     int    MovRecParaPremoveTIconFunc(kobj, messId, argc, pev, trigger)
  388.     int        kobj ;
  389.     int        messId ;
  390.     int        argc ;
  391.     EVENT    *pev ;
  392.     int        trigger ;
  393.     {
  394.         RM_pushRadioButton(kobj, idMovRecWin, idMovRecPremoveTIcon,
  395.                            INTNUM(idMovRecPremoveTIcon), &nParaPremove);
  396.         desktop_checkActivity();
  397.         return NOERR ;
  398.     }
  399.  
  400.     /*    initDataZMOVFILE:idMovRecParaWaitSBar:MJ_SCRLL40の呼び出し関数    */
  401.     int    idMovRecParaWaitSBarFunc(kobj, messId, argc, pev, trigger)
  402.     int        kobj ;
  403.     int        messId ;
  404.     int        argc ;
  405.     EVENT    *pev ;
  406.     int        trigger ;
  407.     {
  408.         nParaWait = RM_getScrollPos(kobj);
  409.         setParaWaitMsg(TRUE);
  410.         return NOERR ;
  411.     }
  412.  
  413.     /*    initDataZMOVFILE:idMovRecOkDBtn:MJ_DBUTTONL40の呼び出し関数    */
  414.     int    MovRecOkFunc(kobj, messId, argc, pev, trigger)
  415.     int        kobj ;
  416.     int        messId ;
  417.     int        argc ;
  418.     EVENT    *pev ;
  419.     int        trigger ;
  420.     {
  421.         bExec = 1;
  422.         MMI_SetHaltFlag(TRUE);
  423.         return NOERR ;
  424.     }
  425.  
  426.     /*    initDataZMOVFILE:idMovRecCancelDBtn:MJ_DBUTTONL40の呼び出し関数    */
  427.     int    MovRecCancelFunc(kobj, messId, argc, pev, trigger)
  428.     int        kobj ;
  429.     int        messId ;
  430.     int        argc ;
  431.     EVENT    *pev ;
  432.     int        trigger ;
  433.     {
  434.         bExec = 0;
  435.         MMI_SetHaltFlag(TRUE);
  436.         return NOERR ;
  437.     }
  438.  
  439.     /*    initDataZMOVFILE:idMovRecAddDBtn[0]:MJ_DBUTTONL40の呼び出し関数    */
  440.     /*    initDataZMOVFILE:idMovRecAddDBtn[1]:MJ_DBUTTONL40の呼び出し関数    */
  441.     /*    initDataZMOVFILE:idMovRecAddDBtn[2]:MJ_DBUTTONL40の呼び出し関数    */
  442.     int    MovRecAddDBtnFunc(kobj, messId, argc, pev, trigger)
  443.     int        kobj ;
  444.     int        messId ;
  445.     int        argc ;
  446.     EVENT    *pev ;
  447.     int        trigger ;
  448.     {
  449.         if (kobj == idMovRecAddDBtn[0])
  450.             nAddSelect = 0;
  451.         else if (kobj == idMovRecAddDBtn[1])
  452.             nAddSelect = 1;
  453.         else if (kobj == idMovRecAddDBtn[2])
  454.             nAddSelect = 2;
  455.         MMI_SetHaltFlag(TRUE);
  456.         return NOERR ;
  457.     }
  458.  
  459.